#pragma once

#include "qbtools.h"
#include <string>
#include <stdint.h>

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class S_TOOL_EXPORT AES
{	
public:
	AES();
	//AES(VOID);
	AES(const char *cchKey);
	virtual ~AES();
	//加密文件数据
	bool EncryptFile(const char *cszpSourceFileName,const char *cszpPwdFileName,const char *cszpKey);
	//解密文件数据
	bool DecryptFile(const char *cszpPwdFileName,const char *cszpResultFileName,const char *cszpKey);
	//加密字符串
	uint32_t DataEncrypt(const char *pszInText,const char *cszpKey,char *datareturn,const char *Protocol);
	//解密字符串
	bool DataDecrypt(const char *pszInText,const char *cszpKey,char *datadecrypted,const char *Protocol, uint32_t nSize);
	//备份数据
	int BackUp(const char *cszpData, const char *cszpKey, const char *cszpFileName);
	//恢复备份的数据
	bool Recover(const char *cszpKey, const char *cszpFileName);
private:
	int ByteToBit(char ch,char* bit);
	int BitToByte(char* bit,char *ch);
	int Char8ToBit64(char* ch,char* bit);
	int Bit64ToChar8(char* bit,char* ch);
	int DES_MakeSubKeys(char* key,char subKeys[16][48]);
	int DES_PC1_Transform(char* key, char* tempbts);
	int DES_PC2_Transform(char* key, char* tempbts);
	int DES_ROL(char* data, int time);
	int DES_IP_Transform(char* data);
	int DES_IP_1_Transform(char* data);
	int DES_E_Transform(char* data);
	int DES_P_Transform(char* data);
	int DES_SBOX(char* data);
	int DES_XOR(char* right, char* left,int count);
	int DES_Swap(char* left,char* right);
	int DES_EncryptBlock(char* plainBlock, char subKeys[16][48], char* cipherBlock);
	int DES_DecryptBlock(char* cipherBlock, char subKeys[16][48], char* plainBlock);
};